package models

import (
	"errors"
	"fmt"
	"gorm.io/gorm"
	"time"
)

// Project 结构体与 projects 表绑定
type Project struct {
	ID         uint64    `gorm:"column:id;primaryKey;autoIncrement" json:"id" form:"id"`
	Name       string    `gorm:"column:name;type:varchar(255);notNull" json:"name" form:"name"`
	GitAddress string    `gorm:"column:git_address" json:"git_address" form:"git_address"`
	Port       string    `gorm:"column:port;" json:"port"`
	CreatedAt  time.Time `gorm:"column:created_at;default:CURRENT_TIMESTAMP" json:"created_at" form:"created_at"`
	UpdatedAt  time.Time `gorm:"column:updated_at;default:CURRENT_TIMESTAMP;updateDefault:CURRENT_TIMESTAMP" json:"updated_at" form:"updated_at"`
}

// TableName 返回绑定的表名
func (Project) TableName() string {
	return "projects"
}

//	GetProjectByID
//
// 描述信息：根据项目id，返回这个项目的全部信息
//
// Param：
//
//	db ：数据库连接实例
//	projectID ：项目id
//
// Return：
//
//	Project ：项目对象 可能不存在
//	error ：错误信息
func GetProjectByID(db *gorm.DB, projectID uint64) (Project, error) {
	var project Project
	result := db.Where("id = ?", projectID).First(&project)
	if result.Error != nil {
		if errors.Is(result.Error, gorm.ErrRecordNotFound) {
			return Project{}, nil // 如果没有找到记录，返回空的 Project 结构体和 nil 错误
		}
		return Project{}, result.Error // 如果是其他错误，返回错误
	}
	return project, nil
}

//	GetProjectIDByGitAddress
//
// 描述信息： 根据 git_address 查询项目 ID
//
// Param：
//
//	db ：数据库链接实例
//	gitAddress ：git项目地址
//
// Return：
//
//	uint64 ：项目id
//	error ：错误信息
func GetProjectIDByGitAddress(db *gorm.DB, gitAddress string) (uint64, error) {
	var project Project
	result := db.Where("git_address = ?", gitAddress).First(&project)
	if result.Error != nil {
		return 0, result.Error
	}
	return project.ID, nil
}

//	GetPortByGitAddress
//
// 描述信息： 根据 Git 地址返回端口号
//
// Param：
//
//	db ：数据库链接实例
//	gitAddress ：项目 git 地址
//
// Return：
//
//	string ：端口号
//	error ：错误信息
func GetPortByGitAddress(db *gorm.DB, gitAddress string) (string, error) {
	var project Project
	// 查询数据库，根据 Git 地址查找项目
	result := db.Where("git_address = ?", gitAddress).First(&project)
	if result.Error != nil {
		// 如果查询失败，返回错误
		return "", result.Error
	}
	// 返回找到的端口号
	return project.Port, nil
}

// DeleteProjectByID 根据 id 删除指定的 Project 记录
func (p Project) DeleteProjectByID(db *gorm.DB, id uint64) error {
	result := db.Where("id = ?", id).Delete(&Project{})
	if result.Error != nil {
		return fmt.Errorf("failed to delete project with id %d: %w", id, result.Error)
	}
	return nil
}
